# -*- coding: utf-8 -*-
"""CSV雪票数据处理系统 - 执行器模块
根据new_requirement.txt的需求，重构execute.py的核心代码，实现表格数据的融合处理
"""
import os
import sys
from collections import defaultdict
from csv_data_fusion import CSVDataFusion

class DataFusionExecutor:
    """数据融合执行器类，负责协调整个数据处理流程"""
    
    def __init__(self):
        # 初始化数据融合实例
        self.data_fusion = CSVDataFusion()
        
    def run(self):
        """执行完整的数据融合流程"""
        try:
            print("=== 开始执行数据融合流程 ===")
            
            # 获取最新的CSV文件
            latest_csv = self.data_fusion.get_latest_csv_file()
            if not latest_csv:
                print("未找到CSV文件，程序退出")
                return False
            
            print(f"使用CSV文件: {os.path.basename(latest_csv)}")
            
            # 确定产品类型
            product_type = self.data_fusion.determine_product_type(latest_csv)
            print(f"产品类型: {product_type}")
            
            # 确定Excel文件路径
            desktop_path = os.path.expanduser("~/Desktop")
            if product_type == "太仓":
                excel_file = os.path.join(desktop_path, "太仓雪票统计.xlsx")
            elif product_type == "耀雪":
                excel_file = os.path.join(desktop_path, "耀雪雪票统计.xlsx")
            else:
                excel_file = os.path.join(desktop_path, "雪票统计.xlsx")
            
            output_file = os.path.join(desktop_path, "result.xlsx")
            
            # 加载表格1数据
            if not self.data_fusion.load_table1_data(excel_file):
                print("加载表格1数据失败，程序退出")
                return False
            
            # 加载表格2数据
            if not self.data_fusion.load_table2_data(latest_csv):
                print("加载表格2数据失败，程序退出")
                return False
            
            # 融合数据 - 按照需求保持表格1原始顺序，表格2数据按日期追加
            if not self.enhanced_fuse_data():
                print("融合数据失败，程序退出")
                return False
            
            # 生成Excel文件
            if self.data_fusion.generate_excel(output_file):
                print("Excel文件生成成功")
            else:
                print("生成Excel文件失败")
                return False
            
            print("=== 数据融合流程完成 ===")
            return True
        except Exception as e:
            print(f"执行过程中出错: {str(e)}")
            import traceback
            traceback.print_exc()
            return False
    
    def enhanced_fuse_data(self):
        """增强版数据融合方法，确保数据顺序符合要求：
        - 保留表格1中的数据顺序
        - 表格2的数据按日期新添在表格1的数据之后
        """
        try:
            # 创建一个列表来存储表格1的原始顺序
            table1_order = []
            
            # 首先复制表格1的数据作为基础，并记录原始顺序
            for date, records in self.data_fusion.table1_data.items():
                for key, info in records.items():
                    # 记录原始顺序
                    table1_order.append((date, key))
                    
                    # 初始化final_data为列表结构，保持顺序
                    if date not in self.data_fusion.final_data:
                        self.data_fusion.final_data[date] = []
                    
                    # 复制信息
                    info_copy = info.copy()
                    
                    # 检查表格2是否有删除标记
                    if date in self.data_fusion.table2_data and key in self.data_fusion.table2_data[date]:
                        if self.data_fusion.table2_data[date][key]['to_delete']:
                            info_copy['to_delete'] = True
                            print(f"标记删除：日期={date}, 姓名={key[0]}, 身份证={key[1]}")
            
            # 创建一个集合来跟踪已处理的记录
            processed_records = set((date, key) for date, key in table1_order)
            
            # 处理表格2的数据，添加新增记录
            new_records = []
            for date, records in self.data_fusion.table2_data.items():
                for key, info in records.items():
                    # 检查是否已处理（在表格1中存在）
                    if (date, key) not in processed_records and info['to_add']:
                        # 如果表格1中不存在且是待发货状态，添加到新记录列表
                        new_records.append((date, key, info.copy()))
                        print(f"发现新增记录：日期={date}, 姓名={key[0]}, 身份证={key[1]}")
            
            # 将新记录按日期分组
            new_records_by_date = defaultdict(list)
            for date, key, info in new_records:
                new_records_by_date[date].append((key, info))
            
            # 按照表格1的原始顺序添加数据到final_data列表
            for date, key in table1_order:
                if key in self.data_fusion.table1_data[date]:
                    info = self.data_fusion.table1_data[date][key].copy()
                    
                    # 检查表格2是否有删除标记
                    if date in self.data_fusion.table2_data and key in self.data_fusion.table2_data[date] and self.data_fusion.table2_data[date][key]['to_delete']:
                        info['to_delete'] = True
                    
                    # 只有未标记删除的才添加到最终数据
                    if not info['to_delete']:
                        self.data_fusion.final_data[date].append((key, info))
            
            # 然后按照表格2的数据顺序添加新增的记录
            for date in self.data_fusion.final_data:
                if date in new_records_by_date:
                    for key, info in new_records_by_date[date]:
                        self.data_fusion.final_data[date].append((key, info))
            
            # 统计最终数据数量
            total_records = sum(len(v) for v in self.data_fusion.final_data.values())
            print(f"数据融合完成，最终数据共 {total_records} 条记录")
            return True
        except Exception as e:
            print(f"融合数据时出错: {str(e)}")
            return False

if __name__ == '__main__':
    # 创建执行器实例并运行
    executor = DataFusionExecutor()
    success = executor.run()
    
    # 根据执行结果设置退出码
    sys.exit(0 if success else 1)